[新機能] AWS IoT Coreから独自のWebサービスに直接データ送信できるようになりました
まいど、大阪の市田です。 本日、IoT関連サービスで大量のリリースが行われました。その中の1つで「IoT Rulesにて独自のWebサービスへデータをPOSTできる」ようになりました。
このアップデートは何がうれしいの?
これまでだと同じことをやりたい場合は、IoT RulesにLambdaアクションを選択する必要がありました。
今回のアップデートでLambdaを使う必要がなくなったので、 ノーコーディングでセンサーデータなどを独自のWebサービス(API Gateway含む)へ簡単に送ることができるようになりました。
それでは試してみます。
準備:サンプル用のWebサービスの用意
データを送る為にAPI Gatewayで簡単なサービスを作成します。
確認なので超簡単に下記のLambdaを用意します。
import json def lambda_handler(event, context): # TODO implement print(event) return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') }
次にAPI Gatewayを用意します。
詳細な手順は割愛しますが、マッピングテンプレートも確認のため簡単に下記のようにしています。
{ "body-json" : $input.json('$') }
IoT Ruleの作成
AWS IoT Coreのコンソールでルールを作成します。ルール名とクエリ内容を入力します。
一時的な動作確認だけなのでクエリも以下の通り簡単なものにします。
SELECT * FROM 'iot/httptest'
アクションの選択で、今回新たに追加になった 「Send a message to a downstream HTTPS endpoint」 を選択しましょう。
選択した状態で 「Configure action」 をクリック すると、具体的な設定画面になります。
ここでデータを送りたいWebサービスのエンドポイントを指定します。先程API Gatewayで作成したHTTPS Endpoint(POSTするリソースまで)を入力して「Add action」をクリックします。
元の画面に戻るので 「Create rule」 をクリックしてルールの作成を完了します。
(この画面を見ると、追加したactionがちゃんと追加されていますね。)
このルールアクションを追加するとAWS IoT Coreから指定したエンドポイントに確認メッセージが送られます。これは設定者がエンドポイントの管理者でアクセス権があることを検証する為です。
この中に含まれている一意のトークンを取得して、AWS IoT側に登録することで追加したルールが使用できるようになります。
今回、データ送信先として「Webサービス」をAPI Gatewayにしているので、CloudWatch Logsにてトークン内容を確認することができます。下記のconfirmationToken
がその内容で、これをAWS IoTに登録するので控えておきましょう。
AWS IoT Coreのコンソールの「Act」にある「Distinations」を開きます。この画面ではトピックルールの宛先、つまりデータをルーティングするWebサービスのエンドポイントの一覧とそのステータスを確認することができます。
ステータスとは、データ送信するためのそれぞれの宛先の状態のことです。
宛先の状態については下記を参照してください。
今回作成したAPI Gatewayは、まだトークンの登録前なので、「IN PROGRESS」 となっています。実際にコンソールに見えているURLは対象のAPI Gatewayのものです。
では、この宛先をクリックしてトークンを登録しましょう。
Actionsから「Confirm and Enable」をクリックします。
トークンの入力欄が現れるので、先程のconfirmationToken
の値を登録します。
トークンが正しければ、対象のエンドポイントの宛先が「有効」となります。コンソールでもステータスが「enable」になっていることが分かります。
これで、このIoT Ruleがトリガーされる度にこのエンドポイントにデータを送ることができるようになりました。
なお、この 「confirmationToken」は3日間のみ有効 なので、速やかに検証を済ませてしまいましょう。
動作確認
それでは実際にデータを送ってみたいと思います。デバイスを用意していないので、IoTコンソールからMQTTでメッセージをPublishしてみたいと思います。
CloudWatch Logsに下記の通りPublishしたメッセージを確認することができたので、AWS IoT Coreを通して正常にAPI GatewayにPOSTできたことが分かりました。
AWS IoT CoreのログからもHTTPアクションが実行されたことが確認できました。
制限事項
このHTTPアクションには、次のような制限があるので利用の前に確認しておきましょう。
特にリクエストタイムアウトはリトライも含めて3秒までのようです。(後述の参考リンクをご参照ください。)
項目 | 制限 |
---|---|
The HTTPS protocol requires a valid certificate issued by a public certificate authority (CA) | N/A |
Ports allowed for HTTP action | 443 and 8443 |
Maximum topic rule destinations per account | 1,000 |
Request timeout | 3,000 ms |
Maximum number of headers per action | 100 |
Maximum size of a header key | 256 bytes |
Maximum length of an endpoint URL | 2 KiB |
HTTP method supported | POST |
最後に
今回はAPI Gatewayを使いましたが、独自のWebサービスなどにも簡単にIoTデータを送ることができると思います。送信先のHTTPアクションの定義も他のバリエーションを指定できるようなので、時間を見つけて試してみたいと思います。
ぜひご活用ください。
参考
- Send a message to a downstream HTTPS endpoint
- Working with Topic Rule Destinations - AWS IoT
- AWS IoT Rule Actions - AWS IoT
- AWS IoT Limits - AWS IoT
こちからは以上です。